from decimal import Decimal

from django.db import models
# model数据模型的基本操作流程：
# 1.安装Django的MySQL模块驱动
# pip install pymysql 或者 pip install mysqlclient
# 2.在settings.py文件中DATABASES配置数据库连接信息
# 3. 在指定的应用中modles.py创建模型class类
# 4.创建迁移⽂件--- 运行命令：python manage.py makemigrations 子应用名
# 5.应⽤迁移--- 运行命令：python manage.py migrate 子应用名
# 6.在视图view.py中使⽤模型
# 7.在模板中使⽤模型数据
# 8.配置 URL 路由
# 9.模版层数据显示

from django.db import models


# 创建作者模型类
class Author(models.Model):
    name = models.CharField(max_length=50)  # 名字字段
    age = models.IntegerField()  # 年龄字段
    email = models.EmailField()  # 邮箱字段

    class Meta:
        db_table = "myapp1_author"  # 指定数据库表名


class Book(models.Model):
    # 属性----对应数据的字段:标题、作者、价格、出版日期……
    title = models.CharField(max_length=50)  # 标题字段
    # author=models.CharField(max_length=50) # 作者字段
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    # ForeignKey-- 外键关联,
    # on_delete=models.CASCADE 删除关联对象时，级联删除关联对象
    price = models.DecimalField(max_digits=5, decimal_places=2)  # 价格字段
    publish_date = models.DateField(auto_now_add=True)  # 出版日期字段

    # auto_now_add=True：仅在创建时自动设置时间
    # auto_now=True：每次保存对象时都会自动更新时间为当前时间（适用于最后修改时间）
    # 无参数：需要手动设置日期值

    # 方法：创建数据对象
    def __str__(self):
        return self.title


    #模型方法
    # book打折处理方法
    def discount(self, discount):
        return self.price * (1 - Decimal(discount)/100) # 返回打折后的价格

    # 元类
    class Meta:
        db_table = "myapp1_books"  # 指定数据库表名
        ordering = ['-price'] # 排序,-号为降序排列，不填符号则默认升序排列

        verbose_name = "图书" # 模型类名
        verbose_name_plural = "图书" # 模型类名复数
        indexes = [
            models.Index(fields=['title'], name='title_index'), # 索引,索引字段
        ]


# 一对一的关系
class User(models.Model):
    name = models.CharField(max_length=50)
    age = models.IntegerField()
    email = models.EmailField()
    gender = models.CharField(max_length=2)

    class Meta:
        db_table = "myapp1_user"


class UserProfile(models.Model):
    bio = models.TextField()
    avatar = models.ImageField(upload_to="avatars/", default="avatars/default.png")
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    class Meta:
        db_table = "myapp1_userprofile"


# 多对多的关系
class Tag(models.Model):
    name = models.CharField(max_length=50)  # 标签名称字段

    class Meta:
        db_table = "myapp1_tag"


class Article(models.Model):
    title = models.CharField(max_length=50)  # 标题字段
    content = models.TextField()  # 内容字段
    tags = models.ManyToManyField(Tag)  # 标签字段,多对多关系

    class Meta:
        db_table = "myapp1_article"


# 创建自定义模型管理类---颜色字段类型
class ColorField(models.CharField):
    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 7  # 颜色字段长度为7，例如:颜色字段格式为#f0f1ac
        super().__init__(*args, **kwargs)  # 继承父类属性

    # 取数据：将数据库中存储的不带#号的⼗六进制颜⾊值转换为带#号的标准格式
    def from_db_value(self, value):
        if value is None:
            return value
        return "#" + value

    # 存储数据：将值转换为Python对象时的处理⽅法,将带#号的颜⾊值转换为不带#号的格式以便存储到数据库中
    def to_python(self, value):
        if isinstance(value, str) and value.startswith("#"):
            return value[1:]  # 截取字符串第1个字符
        return value  # 返回值

class BgColor(models.Model):
    """
    背景颜色字段
    """
    name = models.CharField(max_length=50) #
    color = ColorField() # 颜色字段
    class Meta:
        db_table = "myapp1_bgcolor"

class Canvas (models.Model):
    """
    背景颜色字段
    """
    name = models.CharField(max_length=50) #
    color = ColorField() # 颜色字段
    class Meta:
        db_table = "myapp1_Canvas"